package com.robertux.leaderboard.util.gestoresModelos;

import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Properties;

import org.apache.log4j.Logger;

import com.robertux.leaderboard.util.ResourceLocator;

public class GestorEscalasNota {
	public static final String NOMBRE_ARCHIVO_ESCALAS_NOTA = "escalasNota.properties";
	
	private List<EscalaNota> escalas;
	private boolean rangoInicialInclusivo;
	private boolean rangoFinalInclusivo;
	private Logger logger = Logger.getLogger(this.getClass());
	
	public GestorEscalasNota() {
		this.escalas = new ArrayList<EscalaNota>();
		Properties props = ResourceLocator.loadProperties(NOMBRE_ARCHIVO_ESCALAS_NOTA);
		
		this.rangoInicialInclusivo = new Boolean(props.get("escalas.rangoInicialInclusivo").toString());
		this.rangoFinalInclusivo = new Boolean(props.getProperty("esclas.rangoFinalInclusivo").toString());
		
		for(Entry<Object, Object> propsItem: props.entrySet()) {
			if(propsItem.getKey().toString().contains("escalas.nota")) {
				try {
					String nota = propsItem.getKey().toString().substring(13);
					String[] rangos = propsItem.getValue().toString().split("-");
					escalas.add(new EscalaNota(Integer.parseInt(rangos[0]), Integer.parseInt(rangos[1]), Integer.parseInt(nota)));
				} catch (Exception e) {
					this.logger.error("Error tratando de cargar la escala " + propsItem.getKey() + ": " + e.getMessage(), e);
				}
			}
		}
	}
	
	public int getNotaFromProgreso(double progreso) {
		this.logger.debug("esRangoInicialInclusivo? " + this.esRangoInicialInclusivo());
		this.logger.debug("esRangoFinalInclusivo? " + this.esRangoFinalInclusivo());
		for(EscalaNota escala: this.escalas) {
			if(this.estaEnEscala(progreso, escala)) {
				this.logger.debug(" -- nota encontrada: " + escala.getNota());
				return escala.getNota();
			}
		}
		return 0;
	}
	
	public boolean estaEnEscala(double progreso, EscalaNota escala) {
		this.logger.debug("Buscando progreso con valor " + progreso + " entre la escala [" + escala.getRangoInicial() + ", " + escala.getRangoFinal() + "]");
		return (this.esRangoInicialInclusivo()? escala.getRangoInicial() <= progreso: escala.getRangoInicial() < progreso)
				&& (this.esRangoFinalInclusivo()? escala.getRangoFinal() >= progreso: escala.getRangoFinal() > progreso);
	}
	
	public List<EscalaNota> getEscalas() {
		return this.escalas;
	}
	
	public boolean esRangoInicialInclusivo() {
		return this.rangoInicialInclusivo;
	}
	
	public boolean esRangoFinalInclusivo() {
		return this.rangoFinalInclusivo;
	}
}

class EscalaNota {
	private int rangoInicial;
	private int rangoFinal;
	private int nota;
	
	public EscalaNota(int rangoInicial, int rangoFinal, int nota) {
		super();
		this.rangoInicial = rangoInicial;
		this.rangoFinal = rangoFinal;
		this.nota = nota;
	}
	
	public int getRangoInicial() {
		return rangoInicial;
	}
	public void setRangoInicial(int escalaInicial) {
		this.rangoInicial = escalaInicial;
	}
	public int getRangoFinal() {
		return rangoFinal;
	}
	public void setRangoFinal(int escalaFinal) {
		this.rangoFinal = escalaFinal;
	}
	public int getNota() {
		return nota;
	}
	public void setNota(int nota) {
		this.nota = nota;
	}
}